package utils

import (
	"bindolabs/bindo-smart-pos-api/config"
	_const "bindolabs/bindo-smart-pos-api/models/const"
	"bindolabs/bindo-smart-pos-api/tools/mylog"
	"strconv"

	"github.com/gin-gonic/gin"
)

// paginateData 是一个接受 ctx 和 data 列表作为参数的方法，返回分页后的数据
func PaginateData[T any](ctx *gin.Context, data []T) ([]T, _const.ErrType) {
	page, err := strconv.Atoi(ctx.DefaultQuery("page", "1"))
	if err != nil || page < 1 {
		mylog.Printf("error:%v, page:%v", err, page)
		return nil, _const.ErrTypeInvalidParameterPagination
	}

	pageSize, err := strconv.Atoi(ctx.DefaultQuery("pageSize", config.GetConfig().DefaultPageSize))
	if err != nil || pageSize < 1 {
		mylog.Printf("error:%v, page:%v", err, page)
		return nil, _const.ErrTypeInvalidParameterPagination
	}

	start := (page - 1) * pageSize
	end := start + pageSize

	if start >= len(data) {
		return []T{}, _const.ErrType{}
	}
	if end > len(data) {
		end = len(data)
	}

	return data[start:end], _const.ErrType{}
}
